package com.twj.tools.poi;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.ofdrw.converter.ConvertHelper;
import org.ofdrw.converter.export.ImageExporter;
import org.ofdrw.converter.export.OFDExporter;
import org.ofdrw.converter.export.PDFExporterPDFBox;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;

/**
 * @author 作者: tianwenju
 * @version 1.0
 * @project 金税三期工程核心征管及应用总集成项目
 * @package com.twj.tools.poi
 * @file T1.java 创建时间:2025年07月24日 16:36
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2020 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @reviewer 审核人:
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class T1 {

    public static void main(String[] args) throws IOException {
        String ofdFilePath1 = "D:\\test\\gygy\\06.ofd";
        String ofdFilePath = "D:\\test\\gygy\\农业农村部公告第883号.ofd";
        String pdfFilePath1 = "D:\\test\\gygy\\06.pdf";
        String pdfFilePath = "D:\\test\\gygy\\农业农村部公告第883号.pdf";


//        convertOfd2PDF(ofdFilePath1, pdfFilePath1);

        String docFilePath = "D:\\test\\gygy\\0724.doc";
//         pdfFilePath = "D:\\test\\gygy\\0723.pdf";


        ofdFilePath1 = "D:\\test\\gygy\\系统设计说明书编写规范11.ofd";
//        pdfFilePath1 = "D:\\test\\gygy\\系统设计说明书编写规范.pdf";
        // ofd转图片预览示例 ok
        convertOfd2Pdf(ofdFilePath1, "D:\\test\\gygy\\07");


    }

    private static void convertOfd2PDF(String ofdFilePath, String pdfFilePath) {
        Path ofdPath = Paths.get(ofdFilePath);
        Path pdfPath = Paths.get(pdfFilePath);
        //方法1：版本 1.17.18
        try {
            ConvertHelper.usePDFBox();//使用PDFBox作为转换实现,默认iText作为转换实现
            ConvertHelper.toPdf(ofdPath, pdfPath);
            System.out.println("转换成功！");
        } catch (Exception e) {
            System.err.println("转换失败: " + e.getMessage());
            e.printStackTrace();
        }
        //方法2： 升级 OFDRW 库版本 1.17.18  ->2.0.2
        try (OFDExporter exporter = new PDFExporterPDFBox(ofdPath, pdfPath)) {
            exporter.export();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param ofdFilePath
     * @param imgFileDirPath █▀▀▀▀▀▀▀█████▀▀████▀▀▀▀▀▀▀█
     *                       █ █▀▀▀█ █▄█▄▀█▄   █ █▀▀▀█ █
     *                       █ █   █ █▄ ▄▀█ ▄█▀█ █   █ █
     *                       █ ▀▀▀▀▀ █ ▄▀█ ▄ ▄ █ ▀▀▀▀▀ █
     *                       █▀▀▀▀▀█▀▀▀ ▄▄▄▀ █▄▀█▀█▀█▀██
     *                       █  ▄▄▄▄▀█▀█ ▄▀▀▀▀ ██ ▀▀█ ▀█
     *                       █▀▀▀█  ▀██▀▀█▀▀▀▀█  ▄▀█▀▀ █
     *                       █ █▀▄ ▄▀█▀▄▀▄▀█▀▀▄ ▀ ▀ █ ▀█
     *                       █ █   █▀▄█▄█▄▀▀▀█ ▀   █▀█▄█
     *                       █▀▀▀▀▀▀▀█ ▀▀▄█▀▄▄ █▀█ ▄▀▀▀█
     *                       █ █▀▀▀█ █▀█▀ ▀▀▀  ▀▀▀ ▄▀ ▄█
     *                       █ █   █ █  ▀▄█▀ ██▄▄█▄  ▄ █
     *                       █ ▀▀▀▀▀ █ ▀▄ ▀▀▄▄▄     ▀▀ █
     *                       ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
     */
    /**
     * @param ofdFilePath    ofd文件路径
     * @param imgFileDirPath 生成图片目录
     * @description 相关说明
     * @time 创建时间：2025/7/31 15:22
     * @author 作者：tianwenju
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    private static void convertOfd2Img(String ofdFilePath, String imgFileDirPath) throws IOException {

        Path ofdPath = Paths.get(ofdFilePath);    //OFD文件路径
        Path imgPath = Paths.get(imgFileDirPath); //生成图片目录
        try (ImageExporter exporter = new ImageExporter(ofdPath, imgPath, "PNG", 12d)) {
            exporter.export();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * @param ofdFilePath    OFD文件路径
     * @param imgFileDirPath 生成图片目录
     * @description ofd文件转pdf
     * @time 创建时间：2025/7/31 15:29
     * @author 作者：tianwenju
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    private static void convertOfd2Pdf(String ofdFilePath, String imgFileDirPath) throws IOException {

        File dir = new File(imgFileDirPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        Path ofdPath = Paths.get(ofdFilePath);    //OFD文件路径
        Path imgDir = Paths.get(imgFileDirPath); //生成图片目录



        try (ImageExporter exporter = new ImageExporter(ofdPath, imgDir, "PNG", 12d)) {
            exporter.export();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String pdfFile = ofdPath.toFile().getAbsolutePath().replace(".ofd", ".pdf");
        convertImg2pdf(imgDir, pdfFile);
    }

    /**
     * @param imgDirPath
     * @param pdfFile
     * @description 将图片生成PDF
     * @time 创建时间：2025/7/31 15:30
     * @author 作者：tianwenju
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
        private static void convertImg2pdf(Path imgDirPath, String pdfFile) throws IOException {
        // 遍历imgDirPath下文件
        File[] files = imgDirPath.toFile().listFiles();

        // 添加排序逻辑，确保按数字顺序处理图片
        if (files != null) {
            Arrays.sort(files, Comparator.comparing(
                    File::getName,
                    Comparator.comparingInt(s -> {
                        String num = s.replaceAll("\\D", "");
                        return num.isEmpty() ? 0 : Integer.parseInt(num);
                    })
            ));
        }

        // 创建PDDocument对象
        PDDocument document = new PDDocument();
        for (File file : files) {
            if (file.isFile()) {
                String fileName = file.getName();
                if (fileName.toLowerCase().endsWith(".png")) {
                    // 创建BufferedImage对象
                    BufferedImage image = ImageIO.read(file);
                    // 使用标准A4页面尺寸
                    PDRectangle pageSize = PDRectangle.A4;
                    PDPage page = new PDPage(pageSize);
                    document.addPage(page);

                    // 计算缩放比例以适应页面
                    float scale = Math.min(
                            pageSize.getWidth() / image.getWidth(),
                            pageSize.getHeight() / image.getHeight()
                    );

                    // 居中图片位置
                    float xPos = (pageSize.getWidth() - (image.getWidth() * scale)) / 2;
                    float yPos = (pageSize.getHeight() - (image.getHeight() * scale)) / 2;

                    // 使用PDPageContentStream将图片绘制到页面上
                    PDPageContentStream contentStream = new PDPageContentStream(document, page);
                    PDImageXObject pdImage = PDImageXObject.createFromByteArray(
                            document,
                            Files.readAllBytes(file.toPath()),
                            file.getName()
                    );

                    // 绘制缩放后的图片
                    contentStream.drawImage(pdImage, xPos, yPos,
                            image.getWidth() * scale,
                            image.getHeight() * scale);
                    contentStream.close();
                }
            }
        }
        document.save(pdfFile);
        document.close();
        System.out.println("转换成功：" + pdfFile);
    }






}
